﻿using Kanban.Business;
using Kanban.Entity;
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Kanban.Api.Controllers
{


    public class HomeController : Controller
    {
        [Authorize]
        public ActionResult Index()
        {
            var usuarioBusiness = new UsuarioBusiness();
            Usuario usuario = usuarioBusiness.ObterPorNome(User.Identity.Name);
            ViewBag.Usuario = usuario.Id;

            var equipeBusiness = new EquipeBusiness();
            ViewBag.Equipes = equipeBusiness.ObterPorUsuario(usuario.Id) as List<Equipe>;

            List<Quadro> quadros = Helpers.WebService<List<Quadro>>("quadros?nomeUsuario=" + User.Identity.Name, Method.GET);
            return View(quadros);
        }

        public ActionResult Login()
        {
            return View();
        }

        [Authorize(Roles="Admin,Master")]
        public ActionResult Equipes()
        {
             List<Equipe> equipes = Helpers.WebService<List<Equipe>>("equipes", Method.GET);
             return View(equipes);  
        }

        public ActionResult Sair()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Login");
        }

        [HttpGet]
        public ActionResult Senha()
        {
            var nome = TempData["usuario"].ToString();

            if (string.IsNullOrEmpty(nome))
            {
                TempData["erro"] = "O nome de usuário não pode estar em branco.";
                return View();
            }


            var usuarioBusiness = new UsuarioBusiness();
            Usuario usuario = usuarioBusiness.ObterPorNome(nome);                

            if (usuario == null)
            {
                TempData["erro"] = string.Format("Houve um engano. O usuário {0} não foi encontrado em nossa base de dados.", nome);
                return View();
            }

            ViewBag.Usuario = nome;
            ViewBag.Token = Helpers.Cifrar(nome);

            return View();
        }

        [HttpPost]
        public ActionResult Senha(string token, string senha1, string senha2)
        {
            string nome = Helpers.Decifrar(token);

            var usuarioBusiness = new UsuarioBusiness();

            Usuario usuario = usuarioBusiness.ObterPorNome(nome);

            if (usuario == null)
            {
                TempData["erro"] = string.Format("Houve um engano. O usuário {0} não foi encontrado em nossa base de dados.", nome);
                return View();
            }

            if (senha1 != senha2)
            {
                ModelState.AddModelError("senha1", "As senhas deve ser iguais.");
            }

            if (senha1.Length < 6 || senha1.Length > 12)
            {
                ModelState.AddModelError("senha1", "A senha deve ter de 6 a 12 caracteres.");
            }

            if (ModelState.IsValid)
            {
                usuarioBusiness.AtualizarSenha(usuario.Id, Helpers.EncodeMD5(senha1));
                return RedirectToAction("Login");
            }

            return View();
        }

        [HttpPost]
        public ActionResult Login(string nome, string senha, string returnUrl = null)
        {
            var usuarioBusiness = new UsuarioBusiness();


            if (string.IsNullOrEmpty(nome))
            {
                ModelState.AddModelError("Nome", "O nome não foi informado.");
            }
            else
            {
                if (string.IsNullOrEmpty(senha))
                {
                    ModelState.AddModelError("Senha", "A senha não foi informada.");
                }
                else
                {
                    if (usuarioBusiness.ObterPorNome(nome) == null)
                    {
                        ModelState.AddModelError("Nome", "O usuário não está cadastrado.");
                    }
                }
            }





            if (ModelState.IsValid)
            {
                if (!usuarioBusiness.ConsultarSenhaPorNome(nome) && senha == "k@nban85")
                {
                    TempData["usuario"] = nome;
                    return RedirectToAction("Senha");
                }

                senha = Helpers.EncodeMD5(senha);

                Usuario usuario = usuarioBusiness.ObterPorNomeSenha(nome, senha);
                if (usuario != null)
                {
                    FormsAuthentication.SetAuthCookie(usuario.Nome, false);

                    if (returnUrl != null)
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index");
                    }
                }
                else
                {
                    ModelState.AddModelError("Nome", "Usuário ou senha inválida");
                }
            }

            return View();
        }

        [Authorize]
        public ActionResult Play()
        {
            var quadros = new List<int>();

            string codigos = string.Empty;
            string nomes = string.Empty;

            foreach (Quadro quadro in Helpers.WebService<List<Quadro>>("quadros?nomeUsuario=" + User.Identity.Name, Method.GET))
            {
                if (codigos == string.Empty)
                {
                    codigos = quadro.Id.ToString();
                    nomes = string.Concat("'", quadro.Nome, "'");
                }
                else
                {
                    codigos += string.Concat(", ", quadro.Id.ToString());
                    nomes += string.Concat(", '", quadro.Nome, "'");
                }
                
            }

            ViewBag.QuadrosId = codigos;
            ViewBag.QuadrosNome = nomes;

            return View();
        }

        [Authorize]
        public ActionResult Quadro(int id)
        {
            var usuarioBusiness = new UsuarioBusiness();
            var quadroBusiness = new QuadroBusiness();

            if (usuarioBusiness.ConsultarSePodeVerQuadro(User.Identity.Name, id))
            {

                Usuario usuario = usuarioBusiness.ObterPorNome(User.Identity.Name);
                Quadro quadro = quadroBusiness.ObterPorId(id);

                ViewBag.Quadro = quadro;
                ViewBag.Usuario = usuario;

            }
            else
            {
                return View("Forbidden");
            }

            /*ViewBag.QuadroNome = quadro.Nome;
            ViewBag.Usuario = usuario.Id;
            ViewBag.Quadro = id;*/

            return View();
        }

        public ActionResult Burndown(int id)
        {
            var quadroBusiness = new QuadroBusiness();

            List<BurndownItem> burndown = quadroBusiness.GerarGraficoBurndown(id);



            if (burndown != null)
            {
                var json = new StringBuilder("['Data', 'Planejado', 'A queimar']");
                string planejado = "";
                string queimado = "";

                foreach (BurndownItem item in burndown)
                {
                    planejado = item.Planejado.ToString().Replace(",", ".");
                    if (item.FaltaQueimar.HasValue)
                    {
                        queimado = item.FaltaQueimar.Value.ToString().Replace(",", ".");
                    }
                    else
                    {
                        queimado = "null";
                    }

                    json.AppendFormat(",['{0}', {1}, {2}]", item.Data.ToString("dd/MM"), planejado, queimado);
                }

                ViewBag.Dados = "[" + json.ToString() + "]";
            }
            else
            {
                ViewBag.Dados = "null";
            }

            

            return View();
        }


        public ActionResult MinhasTarefas() 
        {
            var tarefaBusiness = new TarefaBusiness();

            return View(tarefaBusiness.ListarTarefasPendentesPorUsuario(User.Identity.Name));        
        }
    }



}
